package cinvestav.adviseme.bean;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;

import org.springframework.security.context.SecurityContextHolder;

import cinvestav.adviseme.controller.ILugarAgregadoController;
import cinvestav.adviseme.datamodel.LugarAgregado;
import cinvestav.adviseme.datamodel.Persona;
import cinvestav.adviseme.util.DBException;
import cinvestav.adviseme.util.DataBaseDictionary;

/**
*
* @author Javier Silva Pérez
*/
public class MyPlacesViewBean{

	 //<editor-fold defaultstate="collapsed" desc="Atributos de Clase">
    protected ILugarAgregadoController lugarAgregadoController;
    /**
     * Lista de LugarAgregadoes mostradas en la pagina
     */
    protected List<LugarAgregado> lugares;
    /**
     * LugarAgregado Seleccionada
     */
    protected LugarAgregado lugarSeleccionada;
    /**
     * LugarAgregado Modificar
     */
    protected LugarAgregado lugarSeleccionadaModificar;
    /**
     * Valor del CheckBox para el filtro de ID
     */
    protected Boolean slctId;
    /**
     * Valor del CheckBox para el filtro de Nombre
     */
    protected Boolean slctNombre;
    /**
     * Valor del CheckBox para el filtro de Tipo
     */
    protected Boolean slctTipo;

    /**
     * Almacena los posibles mensajes de error
     */
    protected String errorMsg;
    /**
     * Texto insertado en el filtro de nombre
     */
    protected String nombreFiltro;
    /**
     * Texto insertado en el filtro de tipo
     */
    protected String tipoFiltro;
    /**
     * Id insertado como filtro
     */
    protected String idFiltro;

    /**
     * Confirmacion para los diferentes paneles
     */
    private Boolean withConfirmation = true;
    //</editor-fold>


    //<editor-fold defaultstate="collapsed" desc="Gets y Sets">
    /**
     * Obtiene la lista de lugares
     * @return  ArrayList con las lugares
     */
    public List<LugarAgregado> getLugares() {
		return lugares;
	}

    /**
     * Get del ID
     * @return  True si el checkBox esta seleccionado, False de otra manera
     */
    public Boolean getSlctId() {
        return slctId;
    }

    /*
     * Establece el valor del CheckBox de la UI al Bean
     */
    public void setSlctId(Boolean slctId) {
        this.slctId = slctId;
    }

    /**
     * Obtiene el valor del ChackBox para el filtro Nombre
     * @return  True si esta seleccionado en la UI, false de otra manera
     */
    public Boolean getSlctNombre() {
        return slctNombre;
    }

    /**
     * Establece el valor del checkBox en el bean
     * @param slctNombre    Valor del checkBox en la UI
     */
    public void setSlctNombre(Boolean slctNombre) {
        this.slctNombre = slctNombre;
    }
    
    public Boolean getSlctTipo() {
		return slctTipo;
	}

	public void setSlctTipo(Boolean slctTipo) {
		this.slctTipo = slctTipo;
	}


	public String getNombreFiltro() {
		return nombreFiltro;
	}

	public void setNombreFiltro(String nombreFiltro) {
		this.nombreFiltro = nombreFiltro;
	}

	public String getTipoFiltro() {
		return tipoFiltro;
	}

	public void setTipoFiltro(String tipoFiltro) {
		this.tipoFiltro = tipoFiltro;
	}


	/**
     * Set del Controlador de LugarAgregado de Autobuses, manda llamar al metodo de
     * inicializacion
     * @param lugarController
     */
	public void setLugarAgregadoController(
			ILugarAgregadoController lugarAgregadoController) {
		this.lugarAgregadoController = lugarAgregadoController;
		init();
	}
    
    public ILugarAgregadoController getLugarAgregadoController() {
		return lugarAgregadoController;
	}

	public String getErrorMsg() {
        return errorMsg;
    }

    public void setErrorMsg(String errorMsg) {
        this.errorMsg = errorMsg;
    }

    public String getIdFiltro() {
        return idFiltro;
    }

    public void setIdFiltro(String idFiltro) {
        this.idFiltro = idFiltro;
    }

    public LugarAgregado getLugarAgregadoSeleccionada() {
        return lugarSeleccionada;
    }

    public void setLugarAgregadoSeleccionada(LugarAgregado lugarSeleccionada) {
        this.lugarSeleccionada = lugarSeleccionada;
    }

    public Boolean getWithConfirmation() {
        return withConfirmation;
    }

    public void setWithConfirmation(Boolean withConfirmation) {
        this.withConfirmation = withConfirmation;
    }

    public LugarAgregado getLugarAgregadoSeleccionadaModificar() {
        return lugarSeleccionadaModificar;
    }

    public void setLugarAgregadoSeleccionadaModificar(LugarAgregado lugarSeleccionadaModificar) {
        this.lugarSeleccionadaModificar = lugarSeleccionadaModificar;
    }

    //</editor-fold>
    /** Creates a new instance of LugarAgregadoBuscadorViewBean */
    public MyPlacesViewBean() {
        lugares = new LinkedList<LugarAgregado>();
        lugarSeleccionada = new LugarAgregado();
        lugarSeleccionadaModificar = new LugarAgregado();
        //lugarController = new LugarAgregadoController();
    }

    /**
     * Inicializa la lista de todas las lugares
     */
    public void init() {
        try {
        	Persona persona = new Persona();
        	String userName = SecurityContextHolder.getContext().getAuthentication().getName();
			if(userName!=null){
				String userID = userName.substring(userName.lastIndexOf("@")+1);
				Integer id = Integer.parseInt(userID);
				persona.setId(id);
			}
        	
            lugares = lugarAgregadoController.getAll(persona);
            slctId = Boolean.FALSE;
            slctNombre = Boolean.FALSE;
            slctTipo = Boolean.FALSE;
        } catch (DBException ex) {
            errorMsg = ex.getMessage();
        }
    }

    /**
     * Validacion para el ID, verifica que el numero debe ser Entero
     * @param context
     * @param validate
     * @param value
     */
    public void validaFormatoID(FacesContext context, UIComponent validate, Object value) {
        String id = (String) value;
        //Se verifica que el checkbox este seleccionado
        if (slctId) {
            //Se intenta convertir a entero, si hay un error, se coloca en el
            //mensaje designado para estoo
            try {
                Integer.parseInt(id);
            } catch (NumberFormatException ex) {
                ((UIInput) validate).setValid(false);
                FacesMessage msg = new FacesMessage("Solo se permiten digitos");
                context.addMessage(validate.getClientId(context), msg);
            }
        }
    }

    /**
     * Funcion que realiza la busqueda de Lineas de Autobus deacuerdo a los filtros
     * seleccionados en la interfaz
     */
    public void buscar() {    	
        /*
         * Mapa para los filtros seleccionados
         *      Key = Filtro a utilizar, definido en la clase "DataBaseDictionary"
         *      Value = Sera un arreglo de dos posiciones donde:
         *          [0] = Valor a buscar en la base (Valor del campo)
         *          [1] = Tipo de Dato, deacuerdo a este se realizara el set en el
         *                  PreparedStatement, Los tipos validos estan definidos en "DataBaseDictionary"
         */
    	Map <String,String[]> queryMap = new HashMap<String,String[]>();
    	String[] values = new String[3];
    	// Filtrar por el ide de la persona logueada
    	String userName = SecurityContextHolder.getContext().getAuthentication().getName();
		if(userName!=null){
			String userID = userName.substring(userName.lastIndexOf("@")+1);
			values[0] = userID;
		}
		values[0] = "0";
		values[1] = DataBaseDictionary.COLUMN_TYPE_PERSONA_ID;  
		values[2] = DataBaseDictionary.ALIAS_PERSONA;
		queryMap.put(DataBaseDictionary.COLUMN_FILTER_NAME_PERSONA_ID, values);
    	
    	if (slctId){
    		values = new String[3];
    		values[0] = idFiltro;
    		values[1] = DataBaseDictionary.COLUMN_TYPE_PERSONALUGAR_ID_LUGAR;  
    		values[2] = DataBaseDictionary.ALIAS_PERSONALUGAR;
    		queryMap.put(DataBaseDictionary.COLUMN_FILTRO_NAME_PERSONALUGAR_ID_LUGAR, values);
    		
    	}
    	if (slctNombre){
    		values = new String[3];
    		values[0] = nombreFiltro;
    		values[1] = DataBaseDictionary.COLUMN_TYPE_PERSONALUGAR_NOMBRE_LUGAR;
    		values[2] = DataBaseDictionary.ALIAS_LUGAR;
    		queryMap.put(DataBaseDictionary.COLUMN_FILTRO_NAME_PERSONALUGAR_NOMBRE_LUGAR, values);
    	}
    	if (slctTipo){
    		values = new String[3];
    		values[0] = tipoFiltro;
    		values[1] = DataBaseDictionary.COLUMN_TYPE_TIPOLUGAR_TIPO_LUGAR;
    		values[2] = DataBaseDictionary.ALIAS_TIPOLUGAR;
    		queryMap.put(DataBaseDictionary.COLUMN_FILTRO_NAME_TIPOLUGAR_TIPO_LUGAR, values);    		
    	}        
        try {
            //Se realiza la consulta
            lugares = lugarAgregadoController.getByFilters(queryMap);
            lugarSeleccionada = new LugarAgregado();
            lugarSeleccionadaModificar = new LugarAgregado();
            errorMsg = "";
        } catch (DBException ex) {
            //Si existe cualquier error, se muestra el mensaje de error al tipo
            errorMsg = ex.getMessage();
        }
    }

}
